import { defineConfig, loadEnv } from 'vite';
import fs from 'node:fs';
import path from 'node:path';
import react from '@vitejs/plugin-react-swc';
// Bundle 分析
import { visualizer } from 'rollup-plugin-visualizer';
// 开启gzip压缩
import viteCompression from 'vite-plugin-compression';
// 集成unocss
import UnoCss from 'unocss/vite';
// 使用mock
import { viteMockServe } from 'vite-plugin-mock';

import { initEnv } from './src/utils/getEnv';

const APP_ROOT = fs.realpathSync(process.cwd());
const resolveApp = (dir: string) => {
  return path.resolve(APP_ROOT, dir);
};

// https://vite.dev/config/
export default defineConfig(({ mode, command }) => {
  const env = initEnv(loadEnv(mode, resolveApp('env')));
  return {
    base: env.VITE_BASE,
    // 重写环境变量文件存储位置
    envDir: resolveApp('env'),
    server: {
      open: env.VITE_OPEN,
      host: '0.0.0.0',
      port: env.VITE_PORT,
      strictPort: true,
      proxy: {
        // '/api': {
        //   target: 'http://127.0.0.1:8080',
        //   changeOrigin: true,
        //   rewrite: path => path.replace(/^\/api/, '')
        // }
      },
    },
    build: {
      sourcemap: env.VITE_SOURCEMAP,
      terserOptions: {
        compress: {
          drop_debugger: env.VITE_DROP_DEBUGGER,
          drop_console: env.VITE_DROP_CONSOLE,
        },
        format: {
          comments: false, // 删除注释
        },
      },
      rollupOptions: {
        output: {
          // 文件分类
          chunkFileNames: 'static/js/[name]-[hash].js', // 引入文件名的名称
          entryFileNames: 'static/js/[name]-[hash].js', // 包的入口文件名称
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]', // 资源文件像 字体，图片等
          // 分包
          manualChunks(id) {
            if (id.includes('node_modules')) {
              return id
                .toString()
                .split('node_modules/')[1]
                .split('/')[0]
                .toString();
            }
          },
        },
      },
    },
    resolve: {
      alias: {
        '@': resolveApp('./src'),
      },
    },
    css: {
      devSourcemap: env.VITE_DEVSOURCEMAP,
    },
    plugins: [
      react(),
      UnoCss(),
      viteMockServe({
        mockPath: 'mock', // mock文件夹路径
        enable: command === 'serve', // 只有开发环境才开启mock
      }),
      env.VITE_REPORT &&
        visualizer({
          gzipSize: true, // 收集gzip压缩包的大小到图表
          brotliSize: true, // 收集brotli压缩包的大小到图表
          emitFile: false, //是否将生成文件放到dist下边
          filename: 'report.html', //分析图生成的文件名
          open: false, //如果存在本地服务端口，将在打包后自动展示
        }),
      env.VITE_BUILD_GZIP &&
        viteCompression({
          verbose: true, // 是否输入压缩结果
          disable: false, // 是否禁用
          threshold: 10240, // 文件大于1024kb时进行压缩
          algorithm: 'gzip', // 压缩算法
          ext: '.gz', // 压缩包后缀
          deleteOriginFile: true, // 压缩后是否删除源文件
        }),
    ].filter(Boolean),
  };
});
